package t2_两数相加;

/**
 *
 *
 * 给出两个 非空 的链表用来表示两个非负的整数。其中，它们各自的位数是按照 逆序 的方式存储的，并且它们的每个节点只能存储 一位 数字。
 *
 * 如果，我们将这两个数相加起来，则会返回一个新的链表来表示它们的和。
 *
 * 您可以假设除了数字 0 之外，这两个数都不会以 0 开头。
 *
 * 示例：
 *
 * 输入：(2 -> 4 -> 3) + (5 -> 6 -> 4)
 * 输出：7 -> 0 -> 8
 * 原因：342 + 465 = 807
 *
 *
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {

    public static void main(String[] args) {
        //9999999
        ListNode temp1 = new ListNode();
        ListNode l1 = temp1;
        for (int i = 0; i < 7; i++) {
            l1.val = i;
            if (i + 1 < 7){
                l1.next = new ListNode();
                l1 = l1.next;
            }
        }
        //9999
        ListNode temp2 = new ListNode();
        ListNode l2 = temp2;
        for (int i = 0; i < 4; i++) {
            l2.val = 9;

            if (i + 1 < 4) {
                l2.next = new ListNode();
                l2 = l2.next;
            }
        }
        ListNode res = addTwoNumbers(temp1, temp2);
        StringBuffer sres = new StringBuffer();
        while (res != null){
            sres.append(res.val);
            res = res.next;
        }
        System.out.println(sres.reverse());
    }

    // 我的解答
    public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode res = new ListNode();
        ListNode temp = res;
        boolean add = false;
        while (true){
            //终止循环的条件
            if (l1 == null && l2 == null && !add){
                break;
            }
            //获取值
            int a = l1 != null ? l1.val : 0;
            int b = l2 != null ? l2.val : 0;
            //计算
            int c = a + b;
            //判断是否进1
            if (add){
                c = c + 1;
                add = false;
            }
            temp.val = c%10;
            add = c/10 > 0;

            l1 = l1 == null ? null : l1.next;
            l2 = l2 == null ? null : l2.next;

            //判断是否还有下一位数字
            if (l1 != null || l2 != null || add){
                temp.next = new ListNode();
                temp = temp.next;
            }
        }
        return res;
    }


    // 官方解答
    public static ListNode addTwoNumbers1(ListNode l1, ListNode l2) {
        ListNode head = null, tail = null;
        int carry = 0;
        while (l1 != null || l2 != null) {
            int n1 = l1 != null ? l1.val : 0;
            int n2 = l2 != null ? l2.val : 0;
            int sum = n1 + n2 + carry;
            if (head == null) {
                head = tail = new ListNode(sum % 10);
            } else {
                tail.next = new ListNode(sum % 10);
                tail = tail.next;
            }
            carry = sum / 10;
            if (l1 != null) {
                l1 = l1.next;
            }
            if (l2 != null) {
                l2 = l2.next;
            }
        }
        if (carry > 0) {
            tail.next = new ListNode(carry);
        }
        return head;
    }

}